import { sm2,sm4 } from 'sm-crypto'
import { randomBytes } from 'crypto'

//后端公钥
const BACK_SM2_PUBLIC_KEY = '035c80a9b0588f3852f57e9b61d2b04077ee6dc11df09d2bbcc05fc4455b4d2167'

//前端私钥
const FRONT_SM2_PRIVATE_KEY = '5e834634057d372a81ec38997db9051d4764d2fc0a90506eff98fee667764c69'

let prefix = '04' //后端加密结果会加04填充空位

//sm2加密
export function sm2Encrypt(data) {
  return data == null ? null : prefix + sm2.doEncrypt(JSON.stringify(data), BACK_SM2_PUBLIC_KEY, '1')
}

//sm2解密
export function sm2Decrypt(data) {
  if (typeof data === 'string') return sm2.doDecrypt(removePrefixIfMatch(data, prefix), FRONT_SM2_PRIVATE_KEY, 1)
  else return data
}

// 生成SM4密钥
export function generateSM4Key() {
  const buffer = randomBytes(16)
  return buffer.toString('hex')
}


//sm4加密
export function sm4Encrypt(data) {
  if (typeof data === 'string') return sm2.doDecrypt(removePrefixIfMatch(data, prefix), FRONT_SM2_PRIVATE_KEY, 1)
  else return data
}


//sm4解密
export function sm4Decrypt(data) {
  if (typeof data === 'string') return sm2.doDecrypt(removePrefixIfMatch(data, prefix), FRONT_SM2_PRIVATE_KEY, 1)
  else return data
}


/**
 * 如果字符串以指定前缀开头，则移除该前缀。
 * @param {string} str - 要检查和处理的字符串。
 * @param {string} prefix - 要移除的前缀。
 * @returns {string} - 移除前缀后的字符串或原字符串。
 */
function removePrefixIfMatch(str, prefix) {
  if (str.startsWith(prefix)) {
    // 如果字符串以指定前缀开头，则移除该前缀
    return str.substring(prefix.length)
  }
  // 如果字符串不以指定前缀开头，则返回原字符串
  return str
}
